#include "personnage.h"
#include <stdio.h>
#include <assert.h>
#include <malloc.h>
#include "constante.h"

void personnageInit(Personnage *pPersonnage, float x, float y)
{
    vectSetXY(&(pPersonnage->acceleration), 0.0, 0.0);
    vectSetXY(&(pPersonnage->vitesse), 0.0, 0.0);

   	personnageSetX(pPersonnage, x);
	personnageSetY(pPersonnage, y);

	pPersonnage->saut = 0;
	pPersonnage->course = 0;
	pPersonnage->teleportation  = 0;


}


void personnageDetruire(Personnage *pPersonnage)
{
	vectSetXY(&(pPersonnage->acceleration), 0.0, 0.0);
	vectSetXY(&(pPersonnage->vitesse), 0.0, 0.0);
	personnageSetX(pPersonnage, 0);
	personnageSetY(pPersonnage, 0);
	pPersonnage->saut = 0;
	pPersonnage->course = 0;

}


void personnageGauche(Personnage *pPersonnage)
{
	/* a.x = -5 */
	vectSetX(&(pPersonnage->acceleration), -20.0);
}

void personnageDroite(Personnage *pPersonnage)
{
	/* a.x = 5 */
	vectSetX(&(pPersonnage->acceleration), 20.0);
}
void personnageSauter(Personnage *pPersonnage)
{

	if(!personnageGetSaut(pPersonnage)) /* Si le perso n'est pas déjà en l'air */
	{
	 vectSetY(&(pPersonnage->vitesse), -3);
	}
}

void personnageDeplacement(Personnage *pPersonnage)
{

		/* p(t+1)=p(t)+ deltaT v(t) */
		personnageSetX(pPersonnage,(personnageGetPosX(pPersonnage)+IntervalleTemps*vectGetX(&(pPersonnage->vitesse))));
		personnageSetY(pPersonnage,(personnageGetPosY(pPersonnage)+IntervalleTemps*vectGetY(&(pPersonnage->vitesse))));

		/* v(t+1)=v(t) + deltaT a(t)*/
		vectSetX(&(pPersonnage->vitesse) , vectGetX(&(pPersonnage->vitesse))+IntervalleTemps*vectGetX(&(pPersonnage->acceleration)));
		vectSetY(&(pPersonnage->vitesse) , vectGetY(&(pPersonnage->vitesse))+IntervalleTemps*vectGetY(&(pPersonnage->acceleration)));

		if(pPersonnage->course)
		{
			if((vectGetX(&(pPersonnage->vitesse)) > VitesseMaxCourse))
				vectSetX(&(pPersonnage->vitesse) ,VitesseMaxCourse);

			if((vectGetX(&(pPersonnage->vitesse)) < -VitesseMaxCourse))
				vectSetX(&(pPersonnage->vitesse) , -VitesseMaxCourse);

		}
		else
		{
			if((vectGetX(&(pPersonnage->vitesse)) > VitesseMaxMarche))
				vectSetX(&(pPersonnage->vitesse) ,VitesseMaxMarche);

			if((vectGetX(&(pPersonnage->vitesse)) < -VitesseMaxMarche))
				vectSetX(&(pPersonnage->vitesse) , -VitesseMaxMarche);
		}

	/*	if((vectGetY(&(pPersonnage->vitesse)) > VitesseMaxMarche))
			vectSetY(&(pPersonnage->vitesse) ,VitesseMaxMarche);

		if((vectGetY(&(pPersonnage->vitesse)) < -VitesseMaxMarche))
			vectSetY(&(pPersonnage->vitesse) , -VitesseMaxMarche); */
}


void personnageDeceleration(Personnage* pPersonnage)
{
  	        if(vectGetX(&(pPersonnage->vitesse))>1.0 )
  	     	 vectSetX(&(pPersonnage->acceleration) , -1.50);
		else if(vectGetX(&(pPersonnage->vitesse))<-1.50)
  	    	  vectSetX(&(pPersonnage->acceleration) , 1.50);

		else if(((vectGetX(&(pPersonnage->vitesse))>=0.00) && (vectGetX(&(pPersonnage->vitesse))<= 1.50)) ||
			 (((vectGetX(&(pPersonnage->vitesse))<=0.00) && vectGetX(&(pPersonnage->vitesse))>=-1.50)))
		{
			vectSetX(&(pPersonnage->acceleration) , 0.0);
			vectSetX(&(pPersonnage->vitesse) , 0.0);
		}
}

void personnageTestRegression()
{
	Personnage persoTest;

	printf("\n ---------------TestRegression Module Personnage---------------------\n");
	personnageInit(&persoTest, 0.0, 0.0);
	assert(persoTest.posX == 0.0);
	assert(persoTest.posY == 0.0);
	printf("Fonction personnageInit() : Ok!\n");

}



const Vect * personnageGetVitesse(const Personnage *pPersonnage)
{
	return &(pPersonnage->vitesse);
}

void personnageSetVitesseVect(Personnage *pPersonnage,const Vect *vitesse)
{
	pPersonnage->vitesse = *vitesse;
}

void personnageSetVitesseX(Personnage *pPersonnage,float x)
{
    vectSetX(&pPersonnage->vitesse , x);
}

void personnageSetVitesseY(Personnage *pPersonnage,float y)
{
      vectSetY(&pPersonnage->vitesse,y);
}
void personnageSetVitesseXY(Personnage *pPersonnage,float x, float y)
{
    vectSetXY(&pPersonnage->vitesse ,x , y );
}



void personnageSetAccelerationVect(Personnage *pPersonnage,const Vect *acceleration)
{
	pPersonnage->acceleration = *acceleration;
}
void personnageSetAccelerationXY(Personnage *pPersonnage,float x, float y)
{
     vectSetXY(&pPersonnage->acceleration ,x , y );
}
void personnageSetAccelerationX(Personnage *pPersonnage,float x)
{
    vectSetX(&pPersonnage->acceleration ,x  );
}

void personnageSetAccelerationY(Personnage *pPersonnage,float y)
{
     vectSetY(&pPersonnage->acceleration ,y  );
}
const Vect * personnageGetAcceleration(const Personnage *pPersonnage)
{
	return &(pPersonnage->acceleration);
}





float personnageGetPosX(const Personnage *pPersonnage)
{
	return pPersonnage->posX;
}

float personnageGetPosY(const Personnage *pPersonnage)
{
	return pPersonnage->posY;
}
void personnageSetX(Personnage * pPersonnage, float x)
{
	pPersonnage->posX = x;
}

void personnageSetY(Personnage * pPersonnage, float y)
{
	pPersonnage->posY = y;
}

void personnageSetSaut(Personnage *pPersonnage, int saut)
{
 	pPersonnage->saut = saut;
}

int personnageGetSaut(const Personnage *pPersonnage)
{
	return pPersonnage->saut;
}

int personnageGetCourse(const Personnage *pPersonnage)
{
	return pPersonnage->course;
}

void personnageSetCourse(Personnage *pPersonnage, int course)
{
 	pPersonnage->course = course;
}
int personnageGetTeleportation(const Personnage *pPersonnage)
{
    return pPersonnage->teleportation;
}
void personnageSetTeleportation(Personnage *pPersonnage, int i)
{
    pPersonnage->teleportation = i;
}

